package com.ali.gts.servlet.domain;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;
import java.util.function.BiConsumer;

/**
 *
 *  购物车对象
 *
 */
public class Cart {

    //private Integer totalCount = 0;
   // private BigDecimal totalPrice;


    private HashMap<Integer,CartItem> items = new LinkedHashMap<Integer,CartItem>();




    public HashMap<Integer, CartItem> getItems() {
        return items;
    }
    public void setItems(HashMap<Integer, CartItem> items) {
        this.items = items;
    }

    public Integer getTotalCount() {
        final int[] totalCount = {0};
        items.forEach(new BiConsumer<Integer, CartItem>() {
            @Override
            public void accept(Integer integer, CartItem cartItem) {
                //这里的变量totalCount 指的是 外部类的属性，内部类和外部类属性没有重名的时候
                //直接用的是 外部类的属性，如果有重名的要 使用不同的方式来使用，见内部类的学习。
                totalCount[0] = totalCount[0] + cartItem.getItemCount();
            }
        });

        return  totalCount[0];
    }


    public BigDecimal getTotalPrice() {

        final BigDecimal[] totalPrice = {new BigDecimal(0)};
       // Set<Map.Entry<Integer,CartItem>> lists = items.entrySet();


        Iterator<Map.Entry<Integer,CartItem>> iterators = items.entrySet().iterator();

//        while (iterators.hasNext()) {
//            Map.Entry<Integer, CartItem> next = iterators.next();
//            totalPrice = totalPrice.add(next.getValue().getItemTotalPrice());
//        }

//        for (Map.Entry<Integer,CartItem> lists:items.entrySet()) {
//             totalPrice = totalPrice.add(lists.getValue().getItemTotalPrice());
//        }


        iterators.forEachRemaining(obj ->{
            totalPrice[0] = totalPrice[0].add(obj.getValue().getItemTotalPrice());
        });

        return totalPrice[0];
    }





    //购物车的方法，充血模型:添加商品项
    public void addItem(CartItem cartItem){
        //先查看购物车中是否已经添加过此商品，如果以添加，则数量累加，总金额更新，如果没有添加就直接放到集合中
        CartItem cartItem1 = items.get(cartItem.getId());
        if(cartItem1 == null){
            //之前没有添加过此商品
            items.put(cartItem.getId(),cartItem);
        }else {
            //已经有该商品了
            cartItem1.setItemCount(cartItem1.getItemCount() + 1);
            cartItem1.setItemTotalPrice(cartItem1.getItemTotalPrice().add(cartItem.getItemTotalPrice()));
        }

    }

    //购物车的方法，充血模型:删除商品项:deleteItem
    public void deleteItem(Integer id){
        items.remove(id);
    }

    //购物车的方法，充血模型:清空购物车
    public void clearItem(){
        items.clear();
    }

    //购物车的方法，中某个商品的数量
    public void updateItemCount(Integer id,Integer count){
        //先查看购物车中是否有此商品。如果有就修改商品总金额
        CartItem cartItem = items.get(id);

        if(cartItem != null){
            //更新商品数量
            cartItem.setItemCount(count);
            //更新总金额
            cartItem.setItemTotalPrice(cartItem.getPrice().multiply(new BigDecimal(cartItem.getItemCount())));
        }
        //购物车中无此商品暂时不考虑。
    }


    @Override
    public String toString() {
        return "Cart{" +
                "totalCount=" + getTotalCount() +
                ", totalPrice=" + getTotalPrice() +
                ", items=" + items +
                '}';
    }



}
